home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sun4c.md / old / sunromvec.h < prev   
C/C++ Source or Header  |  1990-12-19  |  18KB  |  391 lines

  1. /*
  2.  * sunromvec.h
  3.  *
  4.  * @(#)sunromvec.h 1.7 88/02/08 SMI
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. #ifndef _sunromvec_h
  9. #define    _sunromvec_h
  10. #ifndef MONSTART
  11. /*
  12.  * This file defines the entire interface between the ROM 
  13.  * Monitor and the programs (or kernels) that run under it.  
  14.  * 
  15.  * The main Sun-2 and Sun-3 interface consists of
  16.  * the VECTOR TABLE at the front of the Boot PROM.
  17.  * 
  18.  * The main Sun-4 interface consists of (1) the VECTOR TABLE and (2) the 
  19.  * TRAP VECTOR TABLE, near the front of the Boot PROM.  Beginning at address
  20.  * "0x00000000", there is a 4K-byte TRAP TABLE containing 256 16-byte entries.
  21.  * Each 16-byte TRAP TABLE entry contains the executable code associated with
  22.  * that trap.  The initial 128 TRAP TABLE entries are dedicated to hardware
  23.  * traps while, the final 128 TRAP TABLE entries are reserved for programmer-
  24.  * initiated traps.  With a few exceptions, the VECTOR TABLE, which appeared
  25.  * in Sun-2 and Sun-3 firmware, follows the TRAP TABLE.  Finally, the TRAP 
  26.  * VECTOR TABLE follows the VECTOR TABLE.  Each TRAP VECTOR TABLE entry 
  27.  * contains the address of the trap handler, which is eventually called to 
  28.  * handle the trap condition.
  29.  *
  30.  * These TABLEs are the ONLY knowledge the outside world has of this PROM.
  31.  * They are referenced by hardware and software.  Once located, NO ENTRY CAN
  32.  * BE ADDED, DELETED or RE-LOCATED UNLESS YOU CHANGE THE ENTIRE WORLD THAT
  33.  * DEPENDS ON IT!  Notice that, for Sun-4, EACH ENTRY IN STRUCTURE "sunromvec"
  34.  * MUST HAVE A CORRESPONDING ENTRY IN VECTOR TABLE "vector_table", which 
  35.  * resides in file "../sun4/traptable.s".
  36.  * 
  37.  * The easiest way to reference elements of these TABLEs is to say:
  38.  *      *romp->xxx
  39.  * as in:
  40.  *      (*romp->v_putchar)(c);
  41.  *
  42.  * Various entries have been added at various times.  As of the Rev N, the
  43.  * VECTOR TABLE includes an entry "v_romvec_version" which is an integer 
  44.  * defining which entries in the table are valid.  The "V1:" type comments 
  45.  * on each entry state which version the entry first appeared in.  In order
  46.  * to determine if the Monitor your program is running under contains the 
  47.  * entry, you can simply compare the value of "v_romvec_version" to the 
  48.  * constant in the comment field.  For example,
  49.  *      if (romp->v_romvec_version >= 1) {
  50.  *        reference *romp->v_memorybitmap...
  51.  *      } else {
  52.  *        running under older version of the Monitor...
  53.  *      }
  54.  * Entries which do not contain a "Vn:" comment are in all versions.
  55.  */
  56. struct sunromvec {
  57.   char               *v_initsp;        /* Initial Stack Pointer for hardware.*/
  58.   void               (*v_startmon)();  /* Initial PC for hardware.           */
  59.   int                *v_diagberr;      /* Bus error handler for diagnostics. */
  60.   /* 
  61.    * Configuration information passed to standalone code and UNIX. 
  62.    */
  63.   struct   bootparam **v_bootparam;    /* Information for boot-strapped pgm. */
  64.   unsigned int       *v_memorysize;    /* Total physical memory in bytes.    */
  65.   /* 
  66.    * Single character input and output.
  67.    */
  68.   unsigned char      (*v_getchar)();   /* Get a character from input source. */
  69.   void               (*v_putchar)();   /* Put a character to output sink.    */
  70.   int                (*v_mayget)();    /* Maybe get a character, or "-1".    */
  71.   int                (*v_mayput)();    /* Maybe put a character, or "-1".    */
  72.   unsigned char      *v_echo;          /* Should "getchar" echo input?       */
  73.   unsigned char      *v_insource;      /* Current source of input.           */
  74.   unsigned char      *v_outsink;       /* Currrent output sink.              */
  75.   /* 
  76.    * Keyboard input and frame buffer output.
  77.    */
  78.   int                (*v_getkey)();    /* Get next key if one is available.  */
  79.   void               (*v_initgetkey)();/* Initialization for "getkey".       */
  80.   unsigned int       *v_translation;   /* Keyboard translation selector.     */
  81.   unsigned char      *v_keybid;        /* Keyboard ID byte.                  */
  82.   int                *v_screen_x;      /* V2: Screen x pos (R/O).            */
  83.   int                *v_screen_y;      /* V2: Screen y pos (R/O).            */
  84.   struct keybuf      *v_keybuf;        /* Up/down keycode buffer.            */
  85.  
  86.   char               *v_mon_id;        /* Revision level of the monitor.     */
  87.   /* 
  88.    * Frame buffer output and terminal emulation.
  89.    */
  90.   void               (*v_fwritechar)();/* Write a character to frame buffer. */
  91.   int                *v_fbaddr;        /* Address of frame buffer.           */
  92.   char               **v_font;         /* Font table for frame buffer.       */
  93.   void               (*v_fwritestr)(); /* Quickly write a string to frame    *
  94.                                         * buffer.                            */
  95.   /* 
  96.    * Re-boot interface routine.  Resets and re-boots system.  No return. 
  97.    */
  98.   void               (*v_boot_me)();   /* For example, boot_me("xy()vmunix").*/
  99.   /* 
  100.    * Command line input and parsing.
  101.    */
  102.   unsigned char      *v_linebuf;       /* The command line buffer.           */
  103.   unsigned char      **v_lineptr;      /* Current pointer into "linebuf".    */
  104.   int                *v_linesize;      /* Length of current command line.    */
  105.   void               (*v_getline)();   /* Get a command line from user.      */
  106.   unsigned char      (*v_getone)();    /* Get next character from "linebuf". */
  107.   unsigned char      (*v_peekchar)();  /* Peek at next character without     *
  108.                                         * advancing pointer.                 */
  109.   int                *v_fbthere;       /* Is there a frame buffer or not?    *
  110.                                         * 1=yes.                             */
  111.   int                (*v_getnum)();    /* Grab hex number from command line. */
  112.   /* 
  113.    * Phrase output to current output sink.
  114.    */
  115.   int                (*v_printf)();    /* Similar to Kernel's "printf".      */
  116.   void               (*v_printhex)();  /* Format N digits in hexadecimal.    */
  117.  
  118.   unsigned char      *v_leds;          /* RAM copy of LED register value.    */
  119.   void               (*v_set_leds)();  /* Sets LEDs and RAM copy             */
  120.   /* 
  121.    * The nmi related information. 
  122.    */
  123.   void               (*v_nmi)();       /* Address for the Sun-4 level 14     *
  124.                                         * interrupt vector.                  */
  125.   void               (*v_abortent)();  /* Entry for keyboard abort.          */
  126.   int                *v_nmiclock;      /* Counts in milliseconds.            */
  127.  
  128.   int                *v_fbtype;        /* Frame buffer type: see <sun/fbio.h>*/
  129.   /* 
  130.    * Assorted other things.
  131.    */
  132.   unsigned int       v_romvec_version; /* Version number of "romvec".        */
  133.   struct   globram   *v_gp;            /* Monitor's global variables.        */
  134.   struct zscc_device *v_keybzscc;      /* Address of keyboard in use.        */
  135.   int                *v_keyrinit;      /* Millisecs before keyboard repeat.  */
  136.   unsigned char      *v_keyrtick;      /* Millisecs between repetitions.     */
  137.   unsigned int       *v_memoryavail;   /* V1: Size of usable main memory.    */
  138.   long               *v_resetaddr;     /* where to jump on a RESET trap.     */
  139.   long               *v_resetmap;      /* Page map entry for "resetaddr".    */
  140.   void               (*v_exit_to_mon)();/* Exit from user program.           */
  141.   unsigned char      **v_memorybitmap; /* V1: Bit map of main memory or NULL.*/
  142.   void               (*v_setcxsegmap)();/* Set segment in any context.       */
  143.   void               (**v_vector_cmd)();/* V2: Handler for the 'w' (vector)  *
  144.                                         * command.                           */
  145. #if defined(SUN4) || (sun4)
  146.   unsigned long      *v_exp_trap_signal;/* V3: Location of the expected trap *
  147.                                         * signal.  Was trap expected or not? */
  148.   unsigned long      *v_trap_vector_table_base; /* V3: Address of the TRAP   *
  149.                                         * VECTOR TABLE which exists in RAM.  */
  150. #endif defined(SUN4) || (sun4)
  151.   int                dummy1z;
  152.   int                dummy2z;
  153.   int                dummy3z;
  154.   int                dummy4z;
  155. };
  156.  
  157. /*
  158.  * THE FOLLOWING CONSTANT, "romp" MUST BE CHANGED ANYTIME THE VALUE OF 
  159.  * "PROM_BASE" IN file "../sun2/cpu.addrs.h" (for Sun-2), file 
  160.  * "../sun3/cpu.addrs.h" (for Sun-3) or file "../sun4/cpu.addrs.h" (for Sun-4)
  161.  * IS CHANGED.  IT IS CONSTANT HERE SO THAT EVERY MODULE WHICH NEEDS AN ADDRESS
  162.  * OUT OF STRUCTURE "sunromvec" DOES NOT HAVE TO INCLUDE the appropriate
  163.  * "cpu.addrs.h" file.
  164.  *
  165.  * Since Sun-4 supports 32-bit addressing, rather than 28-bit addressing as is
  166.  * supported by Sun-3, the value of "romp" had to be increased.  Furthermore, 
  167.  * since the VECTOR TABLE, which appeared at the beginning of Sun-3 firmware,
  168.  * now appears after the 4K-byte TRAP TABLE in Sun-4 firmware, the value of
  169.  * "romp" was incresed by an additional 4K.
  170.  *
  171.  * If the value of "romp" is changed, several other changes are required.
  172.  * A complete list of required changes is given below.
  173.  *    (1) Makefile:             RELOC=
  174.  *    (2) ../sun2/cpu.addrs.h:  #define PROM_BASE (for Sun-2)
  175.  * or
  176.  *    (2) ../sun3/cpu.addrs.h:  #define PROM_BASE (for Sun-3)
  177.  * or
  178.  *    (2) ../sun4/cpu.addrs.h:  #define PROM_BASE (for Sun-4)
  179.  *
  180.  */
  181. #if defined(SUN4) || (sun4)
  182. #ifdef CACHE
  183. #define romp ((struct sunromvec *) 0x00001000) /* Used when running the      *
  184.                                                 * firmware out of the cache. */
  185. #else CACHE
  186. #define romp ((struct sunromvec *) 0xFFE81000) /* Used when running the  *
  187.                                                 * firmware out of ROM.   */
  188. #endif CACHE
  189. #else defined(SUN4) || (sun4)
  190. /*
  191.  * Notce that the value of "romp" will be 
  192.  * truncated based on the running hardware:
  193.  *   Sun-2   0x00EF0000
  194.  *   Sun-3   0x0FEF0000
  195.  * This was deliberately done for Sun-3 so that programs using this header
  196.  * file (with the Sun-3 support) would continue to run on Sun-2 systems.
  197.  */
  198. #define romp ((struct sunromvec *) 0x0FEF0000)
  199. #endif defined(SUN4) || (sun4)
  200.  
  201. /*
  202.  * The possible values for "*romp->v_insource" and "*romp->v_outsink" are 
  203.  * listed below.  These may be extended in the future.  Your program should
  204.  * cope with this gracefully (e.g. by continuing to vector through the ROM
  205.  * I/O routines if these are set in a way you don't understand).
  206.  */
  207. #define INKEYB    0 /* Input from parallel keyboard. */
  208. #define INUARTA   1 /* Input or output to Uart A.    */
  209. #define INUARTB   2 /* Input or output to Uart B.    */
  210. #define OUTSCREEN 0 /* Output to frame buffer.       */
  211. #define OUTUARTA  1 /* Input or output to Uart A.    */
  212. #define OUTUARTB  2 /* Input or output to Uart B.    */
  213.  
  214. /*
  215.  * Structure set up by the boot command to pass arguments to the booted program.
  216.  */
  217. struct bootparam {
  218.   char            *bp_argv[8];     /* String arguments.                     */
  219.   char            bp_strings[100]; /* String table for string arguments.    */
  220.   char            bp_dev[2];       /* Device name.                          */
  221.   int             bp_ctlr;         /* Controller Number.                    */
  222.   int             bp_unit;         /* Unit Number.                          */
  223.   int             bp_part;         /* Partition/file Number.                */
  224.   char            *bp_name;        /* File name.  Points into "bp_strings". */
  225.   struct boottab  *bp_boottab;     /* Points to table entry for device.     */
  226. };
  227.  
  228. /*
  229.  * This table entry describes a device.  It exists in the PROM.  A pointer to
  230.  * it is passed in "bootparam".  It can be used to locate ROM subroutines for 
  231.  * opening, reading, and writing the device.  NOTE: When using this interface, 
  232.  * only ONE device can be open at any given time.  In other words, it is not
  233.  * possible to open a tape and a disk at the same time.
  234.  */
  235. struct boottab {
  236.   char           b_dev[2];        /* Two character device name.          */
  237.   int            (*b_probe)();    /* probe(): "-1" or controller number. */
  238.   int            (*b_boot)();     /* boot(bp): "-1" or start address.    */
  239.   int            (*b_open)();     /* open(iobp): "-"1 or "0".            */
  240.   int            (*b_close)();    /* close(iobp): "-"1 or "0".           */
  241.   int            (*b_strategy)(); /* strategy(iobp, rw): "-1" or "0".    */
  242.   char           *b_desc;         /* Printable string describing device. */
  243.   struct devinfo *b_devinfo;      /* Information to configure device.    */
  244. };
  245.  
  246. enum MAPTYPES { /* Page map entry types. */
  247.   MAP_MAINMEM, 
  248.   MAP_OBIO, 
  249.   MAP_MBMEM, 
  250.   MAP_MBIO,
  251.   MAP_VME16A16D, 
  252.   MAP_VME16A32D,
  253.   MAP_VME24A16D, 
  254.   MAP_VME24A32D,
  255.   MAP_VME32A16D, 
  256.   MAP_VME32A32D
  257. };
  258.  
  259. /*
  260.  * This table gives information about the resources needed by a device.  
  261.  */
  262. struct devinfo {
  263.   unsigned int      d_devbytes;   /* Bytes occupied by device in IO space.  */
  264.   unsigned int      d_dmabytes;   /* Bytes needed by device in DMA memory.  */
  265.   unsigned int      d_localbytes; /* Bytes needed by device for local info. */
  266.   unsigned int      d_stdcount;   /* How many standard addresses.           */
  267.   unsigned long     *d_stdaddrs;  /* The vector of standard addresses.      */
  268.   enum     MAPTYPES d_devtype;    /* What map space device is in.           */
  269.   unsigned int      d_maxiobytes; /* Size to break big I/O's into.          */
  270. };
  271.  
  272. /*
  273.  * This following defines the memory map interface
  274.  * between the ROM Monitor and the Unix kernel.
  275.  *
  276.  * The ROM Monitor requires that nobody mess with parts of virtual memory if 
  277.  * they expect any ROM Monitor services.  The following rules apply to all of
  278.  * the virtual addresses between MONSTART and MONEND.
  279.  *   (1) Do not write to these addresses.
  280.  *   (2) Do not read from (depend on the contents of) these addresses, except
  281.  *       as documented here or in <mon/sunromvec.h>.
  282.  *   (3) Do not re-map these addresses.
  283.  *   (4) Do not change or double-map the pmegs that these addresses map through.
  284.  *   (5) Do not change or double-map the main memory that these addresses map 
  285.  *       to.
  286.  *   (6) You are free to change or double-map I/O devices which these addresses
  287.  *       map to.
  288.  *   (7) These rules apply in all map contexts.
  289.  */
  290. #if defined(SUN2) || defined(sun2)
  291. #define MONSTART 0x00E00000
  292. #define MONEND   0x00F00000
  293. #endif defined(SUN2) || defined(sun2)
  294.  
  295. #if defined(SUN3) || defined(sun3)
  296. #define MONSTART 0x0FE00000
  297. #define MONEND   0x0FF00000
  298. #endif defined(SUN3) || defined(sun3)
  299.  
  300. #if defined(SUN4) || (sun4)
  301. #define MONSTART 0xFFD00000
  302. #define MONEND   0xFFF00000
  303. #endif defined(SUN4) || (sun4)
  304.  
  305. #if !defined(SUN4) && !defined(sun4)
  306. /*
  307.  * The one page at MONSHORTPAGE must remain mapped to the same piece
  308.  * of main memory.  The pmeg used to map it there can be changed if so
  309.  * desired.  This page should not be read from or written in.  It is
  310.  * used for ROM Monitor globals, since it is addressable with short
  311.  * absolute instructions.  (We give a 32-bit value below so the
  312.  * compiler/assembler will use absolute short addressing.  The hardware
  313.  * will accept either 0 or 0xF as the top 4 bits.)
  314.  */
  315. #define MONSHORTPAGE 0xFFFFE000
  316. #define MONSHORTSEG  0xFFFE0000
  317. #endif !defined(SUN4) && !defined(sun4)
  318.  
  319. #if defined(SUN4) || (sun4)
  320. /*
  321.  * The one page at GLOBAL_PAGE must remain mapped to the same piece of main 
  322.  * memory.  The pmeg used to map it there can be changed if desired.  This page
  323.  * should not be read from or written into.  It is used for Monitor globals.
  324.  */
  325. #define GLOBAL_PAGE 0xFFEFE000
  326. #endif defined(SUN4) || (sun4)
  327.  
  328. /*
  329.  * For virtual addresses outside the above range, you can re-map the addresses 
  330.  * as desired (but see MONSHORTPAGE).  Any pmeg not referenced by segments 
  331.  * between MONSTART and MONEND can be used freely (but see MONSHORTPAGE).  
  332.  * When a stand-alone program is booted, available main memory will be mapped
  333.  * contiguously, using ascending physical page addresses, starting at virtual
  334.  * address "0x00000000".  The complete set of available memory  may not be  
  335.  * mapped due to a lack of pmegs.  The complete set is defined by globals 
  336.  * "v_memorysize", "v_memoryavail" and "v_memorybitmap".  For non-Sun-4
  337.  * machines, we guarantee that at least MAINMEM_MAP_SIZE page map entries
  338.  * will be available for mapping starting from location "0x0".  For Sun-4, 
  339.  * (at least at the time of Sunrise and Cobra), we guarantee that at least
  340.  * 8 megabytes will be mapped beginning with location "0x0".  When a 
  341.  * stand-alone program is booted, the number of segment table entries required
  342.  * to map DVMA_MAP_SIZE bytes will be allocated.  The corresponding pages will 
  343.  * be mapped into DVMA space.
  344.  */
  345. #if defined(SUN2) || defined(sun2)
  346. #define MAINMEM_MAP_SIZE 0x00600000
  347. #define DVMA_MAP_SIZE    0x00080000
  348. #endif defined(SUN2) || defined(sun2)
  349.  
  350. #if defined(SUN3) || defined(sun3)
  351. #define MAINMEM_MAP_SIZE 0x00800000
  352. #define DVMA_MAP_SIZE    0x00080000
  353. #endif defined(SUN3) || defined(sun3)
  354.  
  355. #if defined(SUN4) ||(sun4)
  356. #define MAINMEM_MAP_SIZE 0x00800000
  357. #define DVMA_MAP_SIZE    0x00080000
  358. #endif defined(SUN4) ||(sun4)
  359.  
  360. /*
  361.  * The following are included for compatability with previous versions
  362.  * of this header file.  Names containing capital letters have been
  363.  * changed to conform with "Bill Joy Normal Form".  This section provides
  364.  * the translation between the old and new names.  It can go away once
  365.  * Sun-1 applications have been converted over.
  366.  */
  367. #define RomVecPtr       romp
  368. #define v_SunRev        v_mon_id
  369. #define v_MemorySize    v_memorysize
  370. #define v_EchoOn        v_echo
  371. #define v_InSource      v_insource
  372. #define v_OutSink       v_outsink
  373. #define v_InitGetkey    v_initgetkey
  374. #define v_KeybId        v_keybid
  375. #define v_Keybuf        v_keybuf
  376. #define v_FBAddr        v_fbaddr
  377. #define v_FontTable     v_font
  378. #define v_message       v_printf
  379. #define v_KeyFrsh       v_nmi
  380. #define AbortEnt        v_abortent
  381. #define v_RefrCnt       v_nmiclock
  382. #define v_GlobPtr       v_gp
  383. #define v_KRptInitial   v_keyrinit
  384. #define v_KRptTick      v_keyrtick
  385. #define v_ExitOp        v_exit_to_mon
  386. #define v_fwrstr        v_fwritestr
  387. #define v_linbuf        v_linebuf
  388.  
  389. #endif MONSTART
  390. #endif _sunromvec_h
  391.